﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Vds2465Parser
{
	internal static class GenParse_UserData_AsciiBytes
	{
		#region private constants

		private const int NrOfHeaderBytes = 2;

		#endregion private constants

		#region internal methods

		internal static byte[] GenerateBytes(byte dataType, byte[] asciiBytes, int maxNrOfChars)
		{
			byte[] userDataBytes = null;
								
			int nrOfAsciiBytes = 0;				
			if (asciiBytes != null)
			{
				nrOfAsciiBytes = asciiBytes.Length;
				if (nrOfAsciiBytes > maxNrOfChars)
				{
					// TODO handle error 
				}
			}
			byte nrOfBytes = (byte)(NrOfHeaderBytes + nrOfAsciiBytes);

			userDataBytes = new byte[nrOfBytes];
			userDataBytes[0] = (byte)(nrOfBytes - GenParse_UserData.HeaderLength);	// user data length
			userDataBytes[1] = dataType;
			if (asciiBytes != null)
			{
				for (int index = 0; index < asciiBytes.Length; index++)
				{
					userDataBytes[NrOfHeaderBytes + index] = asciiBytes.ElementAt(index);
				}
			}			

			return userDataBytes;
		}

		internal static bool ParseBytes(byte[] userDataBytes, byte dataType, out byte[] asciiBytes, out int consumedBytes)
		{
			consumedBytes = 0;
			asciiBytes = null;

			if (userDataBytes.Length >= NrOfHeaderBytes)
			{
				byte setLength = userDataBytes[0];
				if (userDataBytes.Length >= setLength + 2)
				{
					if (setLength > 0)
					{
						// first byte                
						if (userDataBytes[1] == dataType)
						{
							asciiBytes = new byte[setLength];
							for (int index = 0; index < setLength; index++)
							{
								asciiBytes[index] = userDataBytes[NrOfHeaderBytes + index];
							}

							consumedBytes = NrOfHeaderBytes + setLength;
							return true;
						}

						// wrong value for the data type
						return false;
					}

					// TODO handle error (wrong value in first byte the length)
					return false;
				}

				// TODO handle error: not enough bytes as specified by the SL value
				return false;
			}

			// TODO handle error (not enough bytes)
			return false;
		}

		#endregion internal methods
	}
}
